package com.hanyxx.annotaion;
import java.lang.reflect.Method;
/**
 * @author 菠菜饭团
 * @description: 通过注解的形式创建任意对象，并且执行任意方法
 */
@BoCai(className="com.hanyxx.annotaion.PlayGame",methodName = "play")
public class AnnotationTest {
    public static void main(String[] args) throws Exception {
        /**
         *  <A extends Annotation> A getAnnotation(Class<A> annotationClass) ：如果存在该元素的指定类型的注解，则返回这些注解，否则返回 null。
         *  Annotation[] getAnnotations() : 返回此元素上存在的所有注解。
         */
        //1.获取类字节码对象
        Class<AnnotationTest> annotationClass = AnnotationTest.class;
        //2.获取该类的注解对象(本质是在内存中生成该注解接口的子类实现对象)
        BoCai boCai = annotationClass.getAnnotation(BoCai.class);
        //3.获取传入的类名和方法名
        String className = boCai.className();
        System.out.println("获取类名:"+className);
        System.out.println("===========================");
        String methodName = boCai.methodName();
        System.out.println("获取方法名:"+methodName);
        System.out.println("===========================");
        //4.加载类进内存，并获取方法对象
        Class<?> Cls = Class.forName(className);
        Method method = Cls.getMethod(methodName);
        //5.创建对象实例并调用方法
        Object obj = Cls.newInstance();
        method.invoke(obj);
    }
}
